#include <dirent.h>
#include <iostream>
#include <locale.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include "freeze.h"

using namespace cv;
using namespace std;

/********************************************************************************************
*函数描述： freezeException 根据相似度判断剧变还是冻结。
getSim得到的是两幅图的相似度。 *函数参数： Mat img
需要计算的图片，BGR存放格式，彩色（3通道），灰度图无效 *原理：
       1.分别将两幅图转成灰度图
       2.分别求出两幅图的直方图
       3.求出两幅图的直方图相似度。
*函数返回值：
返回值通过判定th阈值大小，返回是否有遮挡，如果相似度高于0.998则判断为画面冻结，
       如果相似度低于0.70，则判断为画面突变。无显式返回值
*********************************************************************************************/
double getSim(Mat src1, Mat src2) {
  Mat matDst1, matDst2;
  Size imageSize = cv::Size(100, 100);

  if (src1.channels() == 3)
    cvtColor(src1, src1, CV_RGB2GRAY);
  if (src2.channels() == 3)
    cvtColor(src2, src2, CV_RGB2GRAY);
  resize(src1, matDst1, imageSize, 0, 0, cv::INTER_CUBIC);
  resize(src2, matDst2, imageSize, 0, 0, cv::INTER_CUBIC);

  int histSize = 256;
  float range[] = {0, 256};
  const float *histRange = {range};

  Mat hist1, hist2;

  calcHist(&matDst1, 1, 0, Mat(), hist1, 1, &histSize, &histRange, 1, 0);
  normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());

  calcHist(&matDst2, 1, 0, Mat(), hist2, 1, &histSize, &histRange, 1, 0);
  normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());

  double Similarity = compareHist(hist1, hist2, CV_COMP_CORREL);
  return Similarity;
}

FrozenStatus freezeException(Mat pre, Mat cur) {
  double sim = getSim(pre, cur);
  if (sim > 0.998) {
    cout << "画面冻结！！！相似度为：" << sim << endl;
	return FrozenStatus::FROZEN;

  } else if (sim < 0.7) {
    cout << "画面剧变！！！相似度为：" << sim << endl;
	return FrozenStatus::CHANGING;
  }
  // else{
  // cout<<"画面正常,相似度为："<<sim<<endl;
  // }
  return FrozenStatus::OK;
}
